home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / IPTUT001.ZIP / testdisk.c < prev    next >
C/C++ Source or Header  |  1995-03-21  |  3KB  |  123 lines

  1. /***********************************************************************
  2. Intermediate Programmer tutorial #001
  3. Copyright (c) 1995 by Jouni Miettunen
  4.  
  5. Critical Error (0x24) handler sample program
  6.  
  7. Test what disk drives are available and what can be used to store data
  8.  
  9. ***********************************************************************/
  10.  
  11. #include <dir.h>
  12. #include <dos.h>
  13. #include <stdio.h>
  14.  
  15. int    my_handler    ( int, int, int, int        );
  16. int    testdisk    ( int                );
  17.  
  18. volatile int    int24_error;
  19.  
  20. static char    *int24_message[] = {
  21.     "Write protect",
  22.     "Unknown unit",
  23.     "Drive not ready",
  24.     "Unknown command",
  25.     "Data error (CRC)",
  26.     "Bad request",
  27.     "Seek error",
  28.     "Unknown media type",
  29.     "Sector not found",
  30.     "Printer out of paper",
  31.     "Write fault",
  32.     "Read fault",
  33.     "General failure",
  34.     "reserved",
  35.     "reserved",
  36.     "Invalid disk change"
  37. };
  38.  
  39. /* main ***************************************************************/
  40. /* the main program ***************************************************/
  41. /**********************************************************************/
  42. int main(void)
  43. {
  44. int    i,
  45. //    limit = 'Z' - 'A' + 1,        // all possible disk drives
  46. //    limit = setdisk(getdisk()),    // number of available drives
  47.     limit = 6,            // keep it short for testing..
  48.     result;
  49.  
  50. for (i=0; i<limit; i++) {
  51.     result = testdisk(i);
  52.     switch (result) {
  53.     case -2:
  54.         printf("Disk drive %c: does not exist.\n", i+'A');
  55.         break;
  56.     case -1:
  57.         printf("Disk drive %c: ready for use.\n", i+'A');
  58.         break;
  59.     default:
  60.         printf("Disk drive %c: exists, error \"%s\".\n",
  61.             i+'A',int24_message[result]);
  62.         break;
  63.     }
  64. }
  65.  
  66. return (0);
  67.  
  68. } /* int main */
  69.  
  70. #pragma argsused
  71. /* my_handler *********************************************************/
  72. /* my own 0x24 function ***********************************************/
  73. /**********************************************************************/
  74. int my_handler(
  75.     int     error,    // error code from DOS - _DI register
  76.     int    ax,
  77.     int    bp,
  78.     int    si
  79.     )
  80. {
  81.  
  82. int24_error = (error & 0xff);
  83. hardretn(2);    // abort
  84. return (2);    // abort
  85.  
  86. } /* int my_handler */
  87.  
  88. /* testdisk ***********************************************************/
  89. /* test if drive can be used or not ***********************************/
  90. /**********************************************************************/
  91. int testdisk(
  92.     int    disk
  93.     )
  94. {
  95. FILE    *fp;
  96. int    orig_disk = getdisk();
  97. void interrupt (*old24)();
  98.  
  99. setdisk(disk);
  100.  
  101. if (getdisk() == disk) {
  102.     int24_error = -1;    // everything ok
  103.     old24 = getvect(0x24);
  104.     harderr(my_handler);
  105.         fp = fopen("$$$$$$$$.$$$","wb");
  106.         if (fp) {
  107.             fclose(fp);
  108.             remove("$$$$$$$$.$$$");
  109.         }
  110.     setvect(0x24,old24);
  111.     setdisk(orig_disk);
  112. }
  113. else
  114.     int24_error = -2;    // can't access drive
  115.  
  116. return(int24_error);
  117.  
  118. } /* int testdisk */
  119.  
  120. /**********************************************************************/
  121. /*************************** A HAPPY END ******************************/
  122. /**********************************************************************/
  123.